
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Sentinel - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>Sentinel - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">为什么在微服务架构中需要进行服务限流？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">因为系统承载的访问量有限，如果不进行流量控制，大量请求会导致系统资源占满、服务超时，在微服务体系中可能引起服务瘫痪和整体不可用的现象。</div>
          </div>
          <div class="card-source">来源: 前言</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">Sentinel 提供了哪些主要特性来保护服务的稳定性？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Sentinel 提供了四大特性：1. 丰富的应用场景（如秒杀、消息削峰填谷）；2. 完备的实时监控；3. 广泛的开源生态（与 Spring Cloud, Dubbo 等整合）；4. 完善的 SPI 扩展点（用于定制逻辑）。</div>
          </div>
          <div class="card-source">来源: Sentinel介绍</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Sentinel Dashboard 是如何获取被监控服务的信息并推送流控规则的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">服务启动时，sentinel-client 会将服务信息注册到 dashboard。同时，client 会在本机启动一个端口（默认为8719）与 dashboard 通讯。当用户在 dashboard 配置规则后，dashboard 会通过这个通讯端口将规则推送到 sentinel-client，client 再根据规则执行流控。</div>
          </div>
          <div class="card-source">来源: Sentinel流控原理</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">Sentinel 流控规则中的“关联”模式是如何工作的？请举例说明。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">“关联”模式指的是当关联的资源达到阈值时，就限流自己。例如，将资源 /hello1 关联到 /hello2，如果 /hello2 的访问量超过阈值，Sentinel 就会开始限制对 /hello1 的访问。这常用于当核心业务（如支付服务）出现问题时，限制上游业务（如下单服务）的流量。</div>
          </div>
          <div class="card-source">来源: 流控规则</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Sentinel 流控效果中的 “Warm Up”（预热）模式有什么作用？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">“Warm Up”模式用于应对系统长期处于低水位时流量突然增加的场景。它通过让流量缓慢增加，在一定时间内逐渐达到阈值上限，给冷系统一个预热时间，避免系统被瞬间突增的流量压垮。其初始阈值是最大QPS阈值的1/3。</div>
          </div>
          <div class="card-source">来源: 流控规则</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">Sentinel 为什么要引入熔断降级机制？它通常在哪一端进行配置？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">引入熔断降级是为了应对不稳定的弱依赖服务调用。当依赖的服务响应慢或不可用时，为避免局部不稳定因素通过调用链路层层放大，导致整体雪崩，需要暂时切断不稳定调用。熔断降级作为一种保护手段，通常在客户端（调用端）进行配置。</div>
          </div>
          <div class="card-source">来源: 熔断降级</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">Sentinel 支持哪三种熔断策略？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Sentinel 支持三种熔断策略：1. 慢调用比例（平均响应时间）；2. 异常比例（ERROR_RATIO）；3. 异常数（ERROR_COUNT）。</div>
          </div>
          <div class="card-source">来源: 熔断降级</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">什么是“热点参数限流”，它主要应用于哪些场景？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">热点参数限流是一种特殊的流量控制，它统计传入参数中的热点值，并仅对包含这些热点参数的资源调用进行限流。主要应用于需要根据参数进行精细化控制的场景，例如：限制对某个热销商品ID的访问频次，或限制某个频繁访问的用户ID。</div>
          </div>
          <div class="card-source">来源: 热点参数限流</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在使用 @SentinelResource 注解时，blockHandler 和 fallback 属性有何区别？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">blockHandler 用于处理因 Sentinel 规则（如限流、降级）触发的 BlockException 异常。而 fallback 用于处理业务代码中抛出的其他所有类型的异常（Throwable）。如果两者同时存在，会遵循就近原则。</div>
          </div>
          <div class="card-source">来源: @SentinelResource</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">Sentinel 的系统自适应限流是什么？它依据哪些指标进行流控？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">系统自适应限流是从应用整体维度对入口流量进行控制，让系统入口流量和系统负载达到平衡。它依据的监控指标包括：Load（仅Linux/Unix）、CPU使用率、总体平均RT、入口QPS和并发线程数。</div>
          </div>
          <div class="card-source">来源: 系统自适应限流</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">默认情况下 Sentinel 的规则是存储在哪里的？文档中介绍了哪种持久化方案？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">默认情况下，Sentinel 的规则存储在内存中，一旦服务重启就会丢失。文档中介绍了将规则持久化到 Nacos 的方案。通过在客户端配置 Nacos 数据源，客户端可以从 Nacos 拉取规则，实现在 Nacos 中修改规则并同步到应用。</div>
          </div>
          <div class="card-source">来源: sentinel持久化</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">请描述 Sentinel 熔断器的三种状态及其转换过程。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Sentinel 熔断器有三种状态：1. Close（关闭）：初始状态，熔断器关闭。2. Open（打开）：当请求异常达到阈值后，熔断器打开，后续请求被阻断。3. Half-Open（半开）：经过一段熔断时长后，熔断器进入半开状态，允许少量请求通过。如果这些请求成功，则熔断器关闭（Close）；如果仍然失败，则再次进入打开状态（Open）。</div>
          </div>
          <div class="card-source">来源: sentinel的熔断原理</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
